一、为什么引入C语言if判断语句?
应用场景:
plain
// 应用场景:只有当按下按钮的时候,电脑才会显示电平的变化,否则就不会显示。这样就不会一直刷屏了
if (判断条件){
业务逻辑执行
} else {
否则:业务逻辑执行
}C语言if判断语句的代码实现:
plain
#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define button_pin_2 GPIO_NUM_2
void app_main(void)
{
// 1,配置GPIO的模式
gpio_set_direction(button_pin_2, GPIO_MODE_INPUT);
// 2,配置成上拉输入
gpio_set_pull_mode(button_pin_2, GPIO_PULLUP_ONLY);
// 3,while 循环检测GPIO电平变化
// 4,if检测到则printf
while (1)
{
uint8_t input_level = gpio_get_level(button_pin_2);
if (input_level == 0){
printf("%d\n", input_level);
}
vTaskDelay(pdMS_TO_TICKS(500));
}
}二、单片机中的有哪些常用的数据类型?
ESP-IDF 中 “专属” 的固定宽度数据类型,核心是 ESP-IDF 基于 stdint.h(C99 标准)提供的固定宽度数据类型—— 这和 STM32 HAL 库的思路完全一致,目的是避免不同架构下原生类型长度不一致的问题。
ESP-IDF 中必须包含头文件 #include <stdint.h>(或间接包含,如 esp_err.h)才能使用这些类型,常用的有:
三、哪些是ESP-IDF 中数据类型的 “单片机专属用法”?
除了固定宽度类型,ESP-IDF 针对单片机场景还有几个实用的类型 / 注意点:
(1)什么是错误码类型 esp_err_t
这是 ESP-IDF 最核心的自定义类型,本质是 int32_t,用于表示函数执行结果:
plain
#include "esp_err.h" // 必须包含
// 示例:调用ESP-IDF API时判断返回值
esp_err_t ret = gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
if (ret != ESP_OK) { // ESP_OK 是 esp_err_t 类型的宏,值为0
ESP_LOGE("GPIO", "设置GPIO方向失败,错误码:%d", ret);
}(2)有哪些浮点类型的注意事项
ESP32 硬件支持硬件浮点运算(FPU),但 ESP-IDF 默认开启浮点支持,使用 float/double 时:
- float 运算效率更高(硬件加速),double 是软件模拟(效率稍低);
- 单片机中尽量避免频繁浮点运算,优先用整数运算(如把小数放大为整数,计算后再缩小)。
(3)有哪些位操作相关类型
操作寄存器 / 外设时,ESP-IDF 常用 uint32_t 表示寄存器值(因为 ESP32 外设寄存器多为 32 位),和 STM32 用 uint32_t 操作寄存器的用法完全一致:
plain
// 示例:直接操作GPIO寄存器(不推荐,仅演示类型用法)
uint32_t *gpio_out_reg = (uint32_t *)0x3FF44004; // GPIO_OUT_REG 地址
*gpio_out_reg |= (1 << 2); // 设置GPIO2输出高电平(uint32_t 位操作)四、如何将轻触开关Button与LED灯结合?
4.1 流程:
- 配置 GPIO 口 有两个 GPIO 口需要配置:一个是 button(按键开关),将其 GPIO 模式设置为上拉输入;另一个是 LED 灯,直接设置为输出模式。
- 编写 while 循环
- 设置变量 定义一个变量来接收 button 的数值变化(即电平变化),调用 GPIO get level 函数获取状态。
- 编写判断语句 如果 button 被按下(电平等于 0),则给 LED 灯的引脚输出一个高电平,点亮 LED 灯;当 button 松开时,相应的 LED 灯随之熄灭。
- 使用延时函数 使用非阻塞的 vTaskDelay 函数,设置延时为 500ms。


4.2 如何在 ESP-IDF 框架下把 Button 与 LED 灯结合编写代码?
4.2.1 代码实现:
plain
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define button_pin_2 GPIO_NUM_2
#define led_pin_4 GPIO_NUM_4
void app_main(void)
{
gpio_set_direction(button_pin_2, GPIO_MODE_INPUT);
gpio_set_pull_mode(button_pin_2, GPIO_PULLUP_ONLY);
gpio_set_direction(led_pin_4, GPIO_MODE_OUTPUT);
while (1)
{
uint8_t button_level = gpio_get_level(button_pin_2);
if (button_level == 0) {
gpio_set_level(led_pin_4, 1);
} else {
gpio_set_level(led_pin_4, 0);
}
vTaskDelay(pdMS_TO_TICKS(10));
}
}